package com.itheima.service;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.constant.MessageConstant;
import com.itheima.dao.CheckItemDao;
import com.itheima.entity.PageResult;
import com.itheima.entity.QueryPageBean;
import com.itheima.pojo.CheckItem;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * （发布的）检查项服务
 */
//因为要暴露服务@Service应该是com.alibaba.dubbo的注解
@Service(interfaceClass = CheckItemService.class)
//这一注解的作用是将服务实现类注册到 Dubbo 的注册中心，
// 使得服务消费者能够通过注册中心找到并调用该服务。

//dubbo的要求：如果加了事务注解@Transactional，那么就需要明确interfaceClass = CheckItemService.class
//当前这个服务实现的是哪一个服务接口
//事务注解
@Transactional
public class CheckItemServiceImpl implements CheckItemService {

    @Autowired
    private CheckItemDao checkItemDao;

    //新增检查项
    @Override
    public void add(CheckItem checkItem) {
        checkItemDao.add(checkItem);
    }

    //分页查询
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {

        Integer currentPage = queryPageBean.getCurrentPage();
        Integer pageSize = queryPageBean.getPageSize();
        //过滤条件
        String queryString = queryPageBean.getQueryString();//ThreadLocal
        //使用基于mybatis框架提供的分页助手插件实现分页查询
        //select * from t_checkitem limit 0,10
        PageHelper.startPage(currentPage,pageSize);
        //不需要返回值，底层是基于ThreadLocal本地线程绑定，他会把当前的这些数据绑定到当前线程中，
        // 到时候他会从线程里边把我们这个数据取出来，然后把它(limit x,y)拼接到整个sql语句后面
        //分页插件，会在执行sql之前将分页关键字追加到SQL后面
        Page<CheckItem> page = checkItemDao.findByCondition(queryString);
        //分页助手会帮忙把查询出来的总记录数和当前页数据封装到page对象中，然后返回
        return new PageResult(page.getTotal(),page.getResult());
    }

    //根据id删除检查项
    @Override
    public void delete(Integer id) {
        long count = checkItemDao.selectCountByCheckItemId(id);
        if(count > 0){
            //已经被关联，不能删除
            throw new RuntimeException(MessageConstant.DELETE_CHECKITEM_FAIL);
        }else{
            //可以删除
            checkItemDao.deleteById(id);
        }
    }

    @Override
    public CheckItem findById(Integer id) {
        return checkItemDao.findById(id);
    }

    @Override
    public void edit(CheckItem checkItem) {
        checkItemDao.edit(checkItem);
    }

    @Override
    public List<CheckItem> findAll() {
        return checkItemDao.findAll();
    }

    //根据检查组id查询关联的检查项id
    @Override
    public List<Integer> findCheckItemIdsByCheckGroupId(Integer checkgroupId) {
        return checkItemDao.findCheckItemIdsByCheckGroupId(checkgroupId);
    }
}